package com.weaving.monitor.service;

import com.weaving.monitor.dto.FlawDetailDto;
import com.weaving.monitor.mapper.ProdFlawMapper;
import com.weaving.monitor.mapper.ProdProdCardMapper;
import com.weaving.monitor.mapper.ProdProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 疵点查询服务类
 * 
 * 功能说明：
 * 1. 提供疵点查询相关的业务逻辑处理
 * 2. 根据机器ID和状态查询生产卡对应的疵点详情
 * 3. 实现多表关联查询的业务逻辑
 * 
 * 注解说明：
 * - @Service: Spring注解，标识这是一个服务类
 * 
 * 主要功能：
 * 1. 根据机器ID和状态查询生产卡ID
 * 2. 根据生产卡ID和状态查询生产品ID列表
 * 3. 根据生产品ID列表查询疵点详情
 * 
 * @author 系统开发团队
 * @version 1.0
 * @since 2024-01-01
 */
@Service
public class FlawQueryService {
    
    @Autowired
    private ProdProdCardMapper prodProdCardMapper;
    
    @Autowired
    private ProdProductMapper prodProductMapper;
    
    @Autowired
    private ProdFlawMapper prodFlawMapper;
    
    /**
     * 根据机器ID和状态查询疵点详情列表
     * 
     * 功能说明：
     * 1. 首先通过machine_id和status查询prod_prod_card表中正在生产的生产卡id
     * 2. 再通过生产卡id去prod_product表中status=1的生产品id列表
     * 3. 最后通过生产品id关联prod_flaw表查询time、position字段
     * 4. 返回生产卡对应的prod_flaw表中的清单
     * 
     * 查询流程：
     * 1. prod_prod_card表：machine_id=? AND status=?
     * 2. prod_product表：card_id=? AND status='1'
     * 3. prod_flaw表：product_id IN (生产品ID列表)
     * 
     * @param machineId 机器ID，如"J001"
     * @param cardStatus 生产卡状态，如"1"表示正在生产
     * @return 疵点详情列表，如果查询不到则返回空列表
     */
    public List<FlawDetailDto> queryFlawDetailsByMachineIdAndStatus(String machineId, String cardStatus) {
        List<FlawDetailDto> result = new ArrayList<>();
        
        try {
            // 1. 根据机器ID和状态查询生产卡ID
            String cardId = prodProdCardMapper.selectCardIdByMachineIdAndStatus(machineId, cardStatus);
            if (cardId == null || cardId.trim().isEmpty()) {
                return result; // 没有找到对应的生产卡
            }
            
            // 2. 根据生产卡ID和状态查询生产品ID列表
            List<String> productIds = prodProductMapper.selectProductIdsByCardIdAndStatus(cardId, "1");
            if (productIds == null || productIds.isEmpty()) {
                return result; // 没有找到对应的生产品
            }
            
            // 3. 根据生产品ID列表查询疵点详情
            List<FlawDetailDto> flawDetails = prodFlawMapper.selectFlawDetailsByProductIds(productIds);
            if (flawDetails != null) {
                // 为每个疵点详情设置生产卡ID
                for (FlawDetailDto flawDetail : flawDetails) {
                    flawDetail.setCardId(cardId);
                }
                result.addAll(flawDetails);
            }
            
        } catch (Exception e) {
            // 记录异常日志，返回空列表
            System.err.println("查询疵点详情时发生异常: " + e.getMessage());
            e.printStackTrace();
        }
        
        return result;
    }
    
    /**
     * 根据机器ID查询当前正在生产的疵点详情列表
     * 
     * 功能说明：
     * 1. 查询指定机器当前正在生产的生产卡对应的疵点详情
     * 2. 默认查询状态为"1"的生产卡
     * 
     * @param machineId 机器ID，如"J001"
     * @return 疵点详情列表
     */
    public List<FlawDetailDto> queryCurrentFlawDetailsByMachineId(String machineId) {
        return queryFlawDetailsByMachineIdAndStatus(machineId, "1");
    }
}
